package projetolp2.Sistem;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * Meal-Points - Projeto de Laborat�rio de programacao 2 - 2011.1
 * 
 * Estabelecimento.
 * 
 * @author  Diego Tavares, 
 * @author  Felipe Travassos 
 * @author  Mayra Kelly
 *
 */

public class Estabelecimento{
	
	private String nome;
	
	private String endereco;
	
	private TipoDeAlmoco tipoAlmoco;
	
	private TipoDeEstabelecimento tipoEstabelecimento;
	
	private int pos; 
	 /** 
	  * 
	  * Estabelecimento usado fora da lista Principal do sistema (posicao Default)
	  * 
	  * @param nome
	  *            O nome do estabelecimento.
	  * @param endereco
	  *            O endereco do estabelecimento.
	  * @param tipoAlmoco
	  *            O tipo de almoco do estabelecimento.
	  * @param tipoEstabelecimento
	  *            O tipo de estabelecimento.
	  * @throws Exception
	  *                  Se o nome do estabelecimento for nulo ou vazio, o endereco do estabelecimento for
	  *                       nulo ou vazio, tipo de almoco nao for nulo ou vazio e tipo de estabelecimento nao for nulo ou vazio.
	  *
	  */
	public Estabelecimento(String nome, String endereco, TipoDeAlmoco tipoAlmoco, TipoDeEstabelecimento tipoEstabelecimento) throws Exception{
		this(nome, endereco, tipoAlmoco, tipoEstabelecimento, 0);
	}
	
	/** 
	 * 
	 * Estabeleciemnto usado dentro da lista Principal do sistema (posicao correspondente a da lista do sistema)
	 * 
	 * @param nome
	 *        O nome do estabelecimento.
	 * @param endereco
	 *        O endereco do estabelecimento.
	 * @param tipoAlmoco
	 *        O tipo de almoco do estabelecimento.
	 * @param tipoEstabelecimento
	 *        O tipo de estabelecimento.
	 * @param pos
	 *        A posicao do estabelecimento na lista de estabelecimentos.
	 * @throws Exception
	 *      Se o nome do estabelecimento for nulo ou vazio, o endereco do estabelecimento for
	 *       nulo ou vazio, tipo de almoco for nulo e tipo de estabelecimento for nulo.

	 */
	
	
	public Estabelecimento(String nome, String endereco, TipoDeAlmoco tipoAlmoco, TipoDeEstabelecimento tipoEstabelecimento, int pos) throws Exception{
		
		try{
		if(nome.equals("")|| nome == null ){
			
			throw new Exception("Nome nao pode ser vazio ou nulo!");
		}if(tipoAlmoco == null){
			
			throw new Exception("Tipo de almoco nao pode ser nulo!");
		}
		if(endereco.equals("")|| endereco == null){
			
			throw new Exception("Endereco nao pode ser vazio ou nulo!");
		}
		if(tipoEstabelecimento == null){
			
			throw new Exception("Tipo de estabelecimento nao pode ser nulo!");
		}
		
		this.nome = nome;
		this.endereco = endereco;
		this.tipoAlmoco = tipoAlmoco;
		this.tipoEstabelecimento = tipoEstabelecimento; 
		this.pos = pos;
		
		}catch(Exception e){
			System.err.println(e.getMessage());
		}
	}
	
	/**
	 * Recupera o nome do Estabelecimento.
	 * 
	 * @return O nome do estabelecimento.
	 */
	
	public String getNome(){return nome;}
	
	/**
	 * Recupera o tipo de almoco do Estabelecimento (A la carte, Self-service ou Prato-feito).
	 * 
	 * @return O tipo de almoco do Estabelecimento.
	 */
    public TipoDeAlmoco getTipoAlmoco(){return tipoAlmoco;}
    
    /**
     * Recupera o endereco do Estabelecimento.
     * 
     * @return O endereco do Estabelecimento.
     */
	public String getEndereco(){return endereco;}
	
	/**
	 * Recupera do tipo de Estabelecimento (Cantina, Boteco ou Restaurante).
	 * 
	 * @return O tipo de Estabelecimento.
	 */
	public TipoDeEstabelecimento getTipoEstabelecimento(){return tipoEstabelecimento;}
	
	/**
	 * Recupera a posicao do Estabelecimento no List.
	 * 
	 * @return A posicao do Estabelecimento.
	 * @throws Exception 
	 */
	public int getPosicao() throws Exception{ ///////////modificacao 03/06/11 (Diego)
		return Sistema.posicaoEstabelecimento(this.getNome());
	}
	
	/**
	 * Troca o nome de um Estabelecimento por outro.
	 * 
	 * @param nome
	 *        O nome do estabelecimento.
	 */
	public void setNome(String nome){this.nome = nome;}
	
	/**
	 * Troca no endereco de um Estabelecimento por outro.
	 * 
	 * @param endereco
	 *        O Endereco do estabelecimento.
	 */
	public void setEndereco(String endereco){this.endereco = endereco;}
	
	/**
	 * Troca o tipo de almoco de um Estabelecimento por outro.
	 * 
	 * @param tipoAlmoco
	 *        O tipo de almoco do estabelecimento.
	 */
	public void setTipoAlmoco(TipoDeAlmoco tipoAlmoco){this.tipoAlmoco = tipoAlmoco;}
	
	/**
	 * Troca o tipo de Estabelecimento por outro.
	 * 
	 * @param tipo
	 *        O tipo de estabelecimento.
	 */
	public void setTipoEstabelecimento(TipoDeEstabelecimento tipo){ this.tipoEstabelecimento = tipo;}
	
	protected void setPosicao(int posicao){ this.pos = posicao; } 
	
	/**
	 * Recupera a popularidade de um dado Estabelecimento. Este metodo pega as opinioes dos
	 * Usuarios de uma Lista de usuarios sobre um Estabelecimento e armazena o valor das mesmas em um "armazenador" de opinioes.
	 * 
	 * @return A popularidade do estabelecimento.
	 * @throws Exception 
	 * @throws Exception 
	 */
	
	public int getPopularidade() throws Exception{
		return Sistema.getPop(this.getNome());
	}
	
	/**
	 * Lista a popularidade dos estabelecimentos cadastrados
	 * a ordem de pontuacao e a ordem que os estabelecimentos estao no arquivo
	 */
	public List<Double> ListaValoresPop() throws Exception{
		List<Double> listaPopularidades = new ArrayList<Double>();
		
		List<Estabelecimento> estabelecimentos = Sistema.getListaEstabelecimentos(); 
		List<Usuario> usuarios = Sistema.getListaUsuarios(); 
		Double contador = 0.0;
		
		for (int i=0; i < estabelecimentos.size(); i++){
			for (int j=0; j < usuarios.size(); j++){ //pega a nota do usuario j para o restaurante i da vez
				contador += usuarios.get(j).getOpiniao().getVotos().get(i).getValorDeOpiniao();
			}
			listaPopularidades.add(contador);
			contador = 0.0;
		}
		return listaPopularidades;
	}
	
	
	/**
	 * Testa a igualdade de um objeto com o Estabelecimento.
	 * 
	 * @param outroEstabeleciemnto
	 *       O objeto a comparar com este Estabelecimento.
	 *       
	 * @return True se o outroEstabelecimento for igual a este Estabelecimento, false caso contr�rio.
	 * 
	 */
	public boolean equals(Object outroEstabelecimento){
		if(!(outroEstabelecimento instanceof Estabelecimento)){
			return false;
		}
		
		Estabelecimento novoEstabelecimento = (Estabelecimento) outroEstabelecimento;
		
		try {
			if(novoEstabelecimento.getNome() == getNome() && novoEstabelecimento.getEndereco() == getEndereco() && 
					novoEstabelecimento.getTipoAlmoco() == getTipoAlmoco()&& novoEstabelecimento.getTipoEstabelecimento() == getTipoEstabelecimento()&& 
					novoEstabelecimento.getPosicao() == getPosicao()){
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	
	/**
	 * Representa o Estabelecimento como String.
	 * 
	 * @return Um string representando o Estabelecimento.
	 * 
	 */
	
	public String toString(){
		return "Nome: "+ nome + " Endereco: "+ endereco + " Tipo de Almoco: "+ tipoAlmoco.toString() +" Tipo de Estabelecimento: "+ tipoEstabelecimento.toString();
	}
	/**
	 * Compara este estabelecimento a outro.
	 * 
	 * @param obj
	 *        Estabelecimento a ser comparado.
	 * @return
	 *        A comparacao dos estabelecimentos.
	 * @throws Exception
	 */
	
	public int compareTo(Estabelecimento obj) throws Exception{
		return this.getPopularidade() - obj.getPopularidade();
	}
} 
